import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:get/get.dart';
import 'package:shimo_app/pages/components/baseDialog.dart';
import 'package:shimo_app/pages/components/hint.dart';
import 'package:shimo_app/pages/setting_component/controller.dart';
import 'package:shimo_app/pages/setting_component/view.dart';

import '../../services/db_service.dart';
import '../../services/device_service.dart';
import '../calibration_component/calibration_component_view.dart';
import '../manual_mode_component/manual_mode_view.dart';
import '../start_component/view.dart';
import 'index_state.dart';

/// 主页面控制器 - 管理应用主界面的状态和逻辑
class IndexController extends GetxController with WidgetsBindingObserver {
  final IndexState state = IndexState(); // 页面状态实例
  int currentPageIndex = 0; // 当前选中的页面索引
  final _deviceService = Get.find<DeviceService>(); // 设备服务实例
  final dbService = Get.find<DbService>(); // 数据库服务实例
  bool inited = false; // 应用初始化状态标志
  String selectedLoginUser = ""; // 当前选中的登录用户ID
  List<Map<String, dynamic>> userList = []; // 用户列表
  User? currentUser; // 当前登录用户信息
  String appVersion = ""; // 应用版本信息

  /// 页面配置列表 - 定义底部导航栏的各个页面
  List<Map<String, dynamic>> pages = [
    {
      "content": StartComponentComponent(), // 页面组件
      "item": BottomNavigationBarItem(
          label: "主界面", icon: Icon(Icons.access_time_filled)), // 导航项
      "privilege": UserPrivilege.userExecutor, // 所需权限级别
    },
    {
      "content": CalibrationComponentComponent(),
      "item":
          BottomNavigationBarItem(label: "仪器校准", icon: Icon(Icons.computer)),
      "privilege": UserPrivilege.userAdmin,
    },
    {
      "content": ManualModeComponent(),
      "item":
          BottomNavigationBarItem(label: "手动控制", icon: Icon(Icons.back_hand)),
      "privilege": UserPrivilege.userAdmin,
    },
    {
      "content": SettingComponentComponent(),
      "item":
          BottomNavigationBarItem(label: "仪器设置", icon: Icon(Icons.settings)),
      "privilege": UserPrivilege.userSuperAdmin,
    },
  ];

  @override
  void onInit() async {
    // 添加应用生命周期观察者
    WidgetsBinding.instance.addObserver(this);

    // 延迟500毫秒等待界面稳定
    await 500.milliseconds.delay();

    // 从数据库获取用户列表
    final u = dbService.getValue<String>("users");

    if (u != null && u.length > 2) {
      // 解析JSON格式的用户列表数据
      userList = jsonDecode(u).cast<Map<String, dynamic>>();
      // 默认选择第一个用户
      selectedLoginUser = userList.first["id"];
      if (userList.isNotEmpty) {
        // 显示登录对话框
        await showLoginDialog();
      }
    }

    // 选择模式对话框代码
    // await showBaseDialog("选择模式", Size(400, 200), Center(
    //   child: SizedBox(
    //     child: Row(
    //       mainAxisAlignment: MainAxisAlignment.center,
    //       children: [
    //         ElevatedButton(
    //             onPressed: () {
    //               Get
    //                   .find<DeviceService>()
    //                   .channelMode = 1;
    //               Get.back();
    //             },
    //             child: Text("单通道模式")),
    //         SizedBox(
    //           width: 40,
    //         ),
    //         ElevatedButton(
    //             onPressed: () {
    //               Get
    //                   .find<DeviceService>()
    //                   .channelMode = 2;
    //               Get.back();
    //             },
    //             child: Text("双通道模式"))
    //       ],
    //     ),
    //   ),
    // ));

    // 标记应用已初始化并更新UI
    inited = true;
    update();

    // 获取应用版本信息
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    String version = packageInfo.version; // 版本号
    String buildNumber = packageInfo.buildNumber; // 构建号
    appVersion = "$version+$buildNumber"; // 组合完整版本信息

    super.onInit();
  }

  @override
  void dispose() {
    // 移除应用生命周期观察者
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    // 监听应用生命周期状态变化
    if (state == AppLifecycleState.paused) {
      // 应用进入后台（用户离开应用）
      print('应用进入后台');
      // 在这里执行进入后台后的处理逻辑
      // 例如：暂停设备操作、保存状态等
    }
  }

  /// 切换页面方法
  void changePage(int index) {
    // 检查设备是否正在运行，运行中不允许切换页面
    if (_deviceService.deviceWorking) {
      showHint("运行中，无法切换界面", HintType.DANGER);
      return;
    }
    // 更新当前页面索引并刷新UI
    currentPageIndex = index;
    update();
  }

  /// 执行登录验证
  void _performLogin(String password) {
    final u = currentUser = _deviceService.doLogin(selectedLoginUser, password);
    if (u == null) {
      // 登录失败提示
      showHint("账号密码错误", HintType.DANGER);
    } else {
      // 登录成功提示
      showHint("登录成功，欢迎${u.name}", HintType.SUCCESS);
      Get.back(); // 关闭登录对话框
    }
  }

  /// 显示登录对话框
  Future<void> showLoginDialog() async {
    String user = ""; // 用户名（当前使用下拉选择，此变量可能未使用）
    String pswd = ""; // 密码

    await showBaseDialog(
      "登录", // 对话框标题
      Size(450, 250), // 对话框尺寸
      Stack(
        children: [
          Column(
            children: [
              SizedBox(height: 20), // 顶部间距

              // 账号选择行
              Row(
                children: [
                  Text("账号",
                      style:
                          TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),

                  // 使用GetBuilder实现响应式下拉框
                  GetBuilder<IndexController>(builder: (controller) {
                    return SizedBox(
                      width: 180,
                      height: 60,
                      child: DropdownButton(
                        // 将用户列表转换为下拉菜单项
                        items: controller.userList
                            .map((e) => DropdownMenuItem<String>(
                                  value: e["id"], // 用户ID作为值
                                  child: Text(e["name"]), // 用户名作为显示文本
                                ))
                            .toList(),
                        value: controller.selectedLoginUser, // 当前选中的用户
                        alignment: Alignment.center, // 居中对齐
                        onChanged: (String? value) {
                          // 用户选择变化时的回调
                          controller.selectedLoginUser = value!;
                          controller.update(); // 更新UI
                        },
                      ),
                    );
                  }),
                ],
                mainAxisAlignment: MainAxisAlignment.spaceBetween, // 两端对齐
              ),

              // 密码输入行
              Row(
                children: [
                  Text("密码",
                      style:
                          TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
                  SizedBox(
                    width: 180,
                    height: 50,
                    child: TextField(
                      maxLines: 1, // 单行输入
                      textAlign: TextAlign.center, // 文本居中
                      style: TextStyle(textBaseline: TextBaseline.alphabetic),
                      decoration: InputDecoration(
                        hintStyle: TextStyle(
                            color: Color.fromRGBO(153, 151, 151, 0.3),
                            fontSize: 16),
                        hintText: "输入密码",
                        alignLabelWithHint: true,
                        contentPadding: EdgeInsets.only(top: 0, bottom: 0),
                      ),
                      obscureText: true, // 密码模式（显示为圆点）
                      onChanged: (val) {
                        pswd = val.toString(); // 更新密码变量
                      },
                      onSubmitted: (value) {
                        // 添加回车登录功能
                        _performLogin(value);
                      },
                    ),
                  ),
                ],
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
              ),
            ],
          ),

          // 登录按钮 - 底部居中
          Align(
            child: ElevatedButton(
                onPressed: () {
                  // 执行登录验证
                  _performLogin(pswd);
                },
                child: Text("登录",
                    style:
                        TextStyle(fontSize: 20, fontWeight: FontWeight.bold))),
            alignment: Alignment.bottomCenter,
          )
        ],
      ),
      closable: false, // 对话框不可关闭（必须登录）
    );
  }

  /// 退出登录方法
  void logout() {
    // 清空当前用户信息
    _deviceService.currentUser = null;
    // 标记为未初始化状态
    inited = false;
    // 跳转到首页
    changePage(0);

    // 使用微任务延迟执行，确保UI更新完成后再显示登录对话框
    Future.microtask(() async {
      await showLoginDialog(); // 显示登录对话框
      inited = true; // 标记为已初始化
      update(); // 更新UI
      Get.find<SettingComponentController>().refreshUserList(); // 刷新用户列表
    });
  }

  /// 获取当前页面组件（带权限检查）
  Widget currentPage() {
    // 如果未登录，直接返回页面内容（不检查权限）
    if (_deviceService.currentUser == null)
      return pages[currentPageIndex]["content"];

    // 检查用户权限是否满足页面要求
    if (pages[currentPageIndex]['privilege'].index >
        _deviceService.currentUser!.privilege.index) {
      // 权限不足，显示无权限提示
      return Center(
        child: Text(
          "无权限",
          style: TextStyle(fontSize: 24, color: Colors.black38),
        ),
      );
    }

    // 权限足够，返回对应的页面内容
    return pages[currentPageIndex]["content"];
  }
}
